package telecom

import (
	"encoding/json"
	"encoding/xml"
	"fmt"

	utils "bserver/pkg/utils"
)

// Request 结构体定义了请求包的格式
type Request struct {
	XMLName xml.Name    `xml:"Request"` // XML根元素名称
	PKType  PKType      `xml:"PK_Type"` // PK类型信息
	Info    interface{} `xml:"Info"`    // 请求的具体信息，使用接口类型，以便于承载多种信息格式
}

// Response 结构体定义了返回包的格式
type Response struct {
	XMLName xml.Name    `xml:"Response"` // XML根元素名称
	PKType  PKType      `xml:"PK_Type"`  // PK类型信息
	Info    interface{} `xml:"Info"`     // 返回的具体信息，使用接口类型，允许承载多种信息格式
}

// PKType 定义了PK的名称和代码
type PKType struct {
	Name string `xml:"Name"` // PK的名称
	Code string `xml:"Code"` // PK的代码
}

// ParsePKType 用于解析XML格式数据，提取出PK的名称和代码
// 参数:
// - xmlData: 要解析的XML数据字符串
// 返回值:
// - name: 解析出的PK名称
// - code: 解析出的PK代码
// - 注意: 如果解析失败，name和code将返回空字符串
func (r *Request) ParsePKType(xmlData string) string {
	err := xml.Unmarshal([]byte(xmlData), r) // 将XML数据解析到Request结构体中
	if err != nil {
		fmt.Printf("Error unmarshaling XML: %v\n", err) // 打印解析错误信息
		return ""                                       // 解析失败时返回空字符串
	}
	return r.PKType.Name // 返回解析得到的PK名称和代码
}

// RespAck 总的响应结构体
type RespAck struct {
	FSUID        string `xml:"FSUID"`        // 设备唯一标识符
	Result       string `xml:"Result"`       // 设置结果
	FailureCause string `xml:"FailureCause"` // 设置失败原因
}

//***********************************************************************
// 业务报文解析
//***********************************************************************

type Login struct {
	UserName  string `xml:"UserName"`
	Password  string `xml:"Password"`
	SUID      string `xml:"SUID"`
	SUIP      string `xml:"SUIP"`
	SUPort    string `xml:"SUPort"`
	SUVendor  string `xml:"SUVendor"`
	SUModel   string `xml:"SUModel"`
	SUHardVer string `xml:"SUHardVer"`
	SUSoftVer string `xml:"SUSoftVer"`
}

// ParseXML 解析登录响应的XML报文
// 参数:
// - xmlData: 登录响应的XML字符串
// 返回值:
// - string: 解析后的登录确认信息的JSON字符串
func (p *Login) ParseXML(xmlData string) error {
	Request := Request{
		Info: p,
	}
	return xml.Unmarshal([]byte(xmlData), &Request)
}

// 定义 XML 结构体
type LoginAck struct {
	XMLName      xml.Name    `xml:"Info"`
	SUID         string      `xml:"SUID"`
	SCIP         string      `xml:"SCIP"`
	Result       string      `xml:"Result"`
	FailureCode  string      `xml:"FailureCode"`
	FailureCause string      `xml:"FailureCause"`
	ACL          LoginAckACL `xml:"ACL"`
}

type LoginAckACL struct {
	IPList LoginAckIPList `xml:"IPList"`
}

type LoginAckIPList struct {
	IPs []string `xml:"IP"`
}

// GenXML 生成登录确认信息的XML报文
// 参数:
// - j: 登录确认信息的JSON字符串
// 返回值:
// - string: 生成的XML报文字符串
func (p *LoginAck) GenXML(j string) string {
	err := json.Unmarshal([]byte(j), p)
	if err != nil {
		fmt.Println("json to xml err")
	}
	request := Request{
		PKType: PKType{
			Name: "LOGIN_ACK",
			Code: "102",
		},
		Info: p,
	}
	return utils.GenXML(request)
}
